package com.tfjybj.itoo.exam.provider.service;

//import com.dmsdbj.itoo.tool.base.service.BaseServicePlus;
//import com.dmsdbj.itoo.tool.business.ItooResult;
//import com.tfjybj.itoo.exam.entity.ExaminationEntity;

import com.dmsdbj.itoo.tool.business.ItooResult;
import com.tfjybj.itoo.exam.entity.ExamineeEntity;
import com.tfjybj.itoo.exam.entity.PaperRecordEntity;
import com.tfjybj.itoo.exam.entity.QuestionEntity;
import com.tfjybj.itoo.exam.model.*;

import java.util.Date;
import java.util.List;


/**
 * OnlineExamService接口
 *
 * @author 任蒙蒙
 * @version 2.0.0
 * @since 2.0.0 2018-11-16 14:57:42
 */
public interface OnlineExamService {

    /**
     * 在线考试：随机抽卷
     *
     * @param templateId 模板id
     * @param examineeId 考生id
     * @param courseId 课程id
     * @author 任蒙蒙
     * @since 2.0.0 2018年11月22日16:57:37
     */
    ExamPaperModel getPaperByTemplateRandom(String templateId, String examineeId, String courseId, String operator);

    /**
     * 在线考试：根据学生ID生成本次考试试卷
     *
     * @param studentId 学生 ID
     * @param Ip        学生登陆的IP地址
     * @param sessionId sessionId
     * @return 试卷详情
     * @author 任蒙蒙
     * @since 2.0.0 2018-11-16 17:10:28
     */
//    ItooResult findPaperByStudentIdForOnlineExam(String studentId, String Ip, String sessionId);

    /**
     * 查询系统中所有题型信息
     *
     * @return 所有题型信息
     * @author  王雪芬
     * @since 2.0.0 2018-11-16 17:10:28
     */
    List<QuestionTypeModel> selectQuestionTypeId();

    /**
     * 根据考试id查询考生须知
     * @param examId 考试id
     * @return 考生须知
     * @author 王雪芬
     * @since 2018-11-23 15:51:29
     */
    ExamNotesModel queryExamNotes(String examId);

    /**
     * 通过考试id查询试题存储到reids
     * @param examId   考试id
     * @param operator 操作人
     * @author 王雪芬
     * @since 2.0.0 2018年11月21日16:01:32
     */
    boolean queryExamOnlineQuestionInfo(String examId, String operator);

    /**
     * 通过考试id和操作人查询考试信息
     *
     * @param examId   考试id
     * @param operator 操作人
     * @author 王雪芬
     * @since 2.0.0 2018年11月21日16:01:32
     */
    List<ExamOnlineinforedisModel> examOnlineInfo(String examId, String operator);

    /**
     * 通过考试id或者操作人从redis中查询试题
     *
     * @param examId   考试id
     * @param operator 操作人
     * @author 王雪芬
     * @since 2.0.0 2018年11月21日16:01:32
     */
    List<QuestionMainModel> examOnlineQuestionGetRedis(String examId, String operator);

    /**
     * 根据操作人id查询正在进行的考场
     * @param operator 操作人 可有可无
     * @author 王雪芬
     * @since 2.0.0 2018年11月22日16:01:32
     */
    List<ExamRoomModel> examOnlineExamRoom(String operator);

    /**
     * 根据操作人id查询今天和明天即将开始的考试
     *
     * @param operator 操作人
     * @author 王雪芬
     * @since 2.0.0 2018年11月22日16:01:32
     */
    List<ExaminationModel> queryExamTimeInfo(String operator);

     ExaminOnlineModel queryExamStudentInfoLogin(String studentId);

    /**
     * 根据学号查询当前考试(或者距离最近的考试)中学生基本信息
     * @param exameeId 考生id
     * @param
     * @return 学生信息
     * @author 王雪芬
     * @since 2018-11-23 15:51:29
     */
    ExamInfoModel queryExamStudentInfo(String examationId, String exameeId);

    /**
     * 交卷，修改考生考试状态为“已交卷”状态
     *
     * @param examineeEntity 考生安排
     * @return 成功或者失败
     * @author  王雪芬
     * @since 2.0.0 2018年11月22日21:22:58
     */
    boolean updateExamStateBySumit(ExamineeEntity examineeEntity);

    /**
     * 获取考试剩余分钟数
     *
     * @param examineeId 学生学号
     * @return 剩余分钟数
     * @author  王雪芬
     * @since 2.0.0 2018年11月22日21:22:58
     */
    long getExamRemainTime(String examineeId);

    /**
     * 获取当前时间4个小时内所有的所有考试-考试预加载-王雪芬-2018年11月24日
     *
     * @return 考试
     * @author 王雪芬
     * @since 2.0.0 2018年11月22日21:22:58
     */
    int getExamResourse();

    /**
     * 二次登陆更新ip
     *
     * @param exameeId 考生id
     * @param ip        更换机器后ip
     * @return 是否保存成功
     * @author 邓立瑶
     * @since 2.0.0 2018年11月24日14:52:06
     */
     boolean updateReLoginIP(String exameeId, String ip);

    /**
     * 二次回显答题记录
     * @return 返回二次回显答题记录
     * @param examPaperModel 试卷
     * @param  studentId  学生id
     * @param  templateId 模板id
     * @author 王雪芬
     * @since 2.0.0 2018-11-27 17:10:28
     */
      ExamPaperModel getExamPaperRecord(ExamPaperModel examPaperModel, String studentId, String templateId);

    /**
     * 在线考试：根据学生ID生成本次考试试卷
     *
     * @param examationId 学生 ID
     * @return 试卷详情
     * @author 王雪芬
     * @since 2.0.0 2018-11-27 17:10:28
     */
    ItooResult findPaperByStudentIdForOnlineExam(String examationId, String clientIp, String examineeId, String sessionId);



       /**
     * 通过考试ID获取考试时长
     *
     * @param examId
     * @return 返回考试时长
     * @author 杨楠
     * @date 2018-11-22 16:29:31
     */

    int getExamDuration(String examId);


    /**
     * 业务题处理，对业务题添加选项list处理--题干要求
     *
     * @param examPaperModel 试卷实体
     * @author 杨楠
     * @since 2.0.0 2018-11-17 17:10:28
     */

    ExamPaperModel dealBusinessProblems(ExamPaperModel examPaperModel);


    /**
     * 查对试卷上小题和子题进行排序
     *
     * @param examPaperModel 试卷实体
     * @return examPaperModel 试卷实体
     * @author 杨楠
     * @since 2.0.0 2018-11-16 17:10:28
     */
    ExamPaperModel getPaperSort(ExamPaperModel examPaperModel);

    /**
     * 根据答题记录中的试卷或模版id和考生id查询试卷
     *
     * @param examineeId 考生id
     * @param templateId   试卷或模版id
     * @return 试卷实体
     * @since1.0.5 2017-8-3
     * @author  王雪芬
     */

    ExamPaperModel queryPaperAndRecord(String examineeId, String templateId);



    /**
     * 插入学生抽卷记录和答题记录
     *
     * @return 是否插入成功
     * @param examineeId 考生id
     * @param examinationId 考试id
     * @param examPaperModel 试卷详情model
     * @author  王雪芬
     * @since 2.0.0 2018-11-24 17:10:28
     */

    List<PaperRecordEntity>  insertAllPaperRecord (String examineeId, String examinationId, ExamPaperModel examPaperModel);

    /**
     * 贾建清
     * @param coursePaperRecordModel
     * @return
     */
    List<PaperRecordEntity> insertPaperRecord(CoursePaperRecordModel coursePaperRecordModel);

    /**
     * 判断二次登陆密码是否正确
     *
     * @param password 密码
     * @return 布尔值
     * @author  王雪芬
     * @since 2.0.0 2018年11月26日12:14:37
     */
    boolean getSecordLoginPassword(String password);

    /**
     * 更新考试状态为已抽题
     * @param endTime
     * @param duration
     * @param examineeId
     * @return
     * @author 李娜
     * @since 2019年7月9日
     */
    boolean updateStateExamStudent(Date endTime, long duration, String examineeId, String clientIp);
    /**
     * 随堂小练使用
     * @param examineeId 考生id
     * @param ip 考生ip
     * @param getStemDate 考试开始时间,也就是学生抽卷时间
     * @return
     */
    boolean updateStateExamStudent(String examineeId, String ip, Date getStemDate);
    /**
     * 更新答题记录
     *
     * @param  paperOnlineRecordModel 试卷内容
     * @return  flag 是否更新答题记录成功
     * @author 王雪芬
     * @since 2.0.0 2018年11月26日12:14:37
     */
    boolean updateExamPaperRecord(PaperOnlineRecordModel paperOnlineRecordModel);

    /**
     *  给模板使用浏览试卷
     * @return flag 给模板使用浏览试卷
     * @author 王雪芬
     * @since 2.0.0 2018年12月17日15:54:37
     */
    ItooResult queryQuestionTempleate(String courseId, String templeateId, String operator);


    /**
     * 查询调查问卷
     * @return flag 问卷详情
     * @author 王雪芬
     * @since 2.0.0 2018年12月17日15:54:37
     */
    ItooResult findQuestionNaire();


    /**
     *  重新抽卷
     * @return ItooResult 是否成功
     * @author 王雪芬
     * @since 2.0.0 2018年12月22日15:54:37
     */
    ItooResult queryRecoverQuestionPerson(ExamRecoverModel examRecoverModel);

    ItooResult queryExamination(String examineeId, String templateId);

    /**
     * 修改抽到错题的考生的错题,放到redis
     *
     * @param examineeModelList 考生list
     * @param oldQuestionId 旧题Id
     * @param newQuestionId 新题Id
     * @author 任蒙蒙
     * @since 2.0.0 2018-11-17 17:10:28
     */
    Boolean updateWrongQuesForExaminee(List<ExamineeModel> examineeModelList, String oldQuestionId, String newQuestionId);

    /**
     * 题库接口--根据题干Id查询当前考试是否有需要修改的题干
     *
     * @param questionEntity 试题实体
     * @return 布尔值
     * @author 任蒙蒙
     */
    Boolean getExamineeStatusChange(QuestionEntity questionEntity);

    /**
     *未正常交卷的考生考试结束时，自动正常交卷,更改考神状态为3
     * @return 是否成功
     */
    int examOnlineExamineeState();

    /**
     * 固定抽题-随堂小练用
     *
     * @return flag 给模板使用显示试卷
     * @author 任蒙蒙
     * @since 2.0.0 2019年1月29日19:32:01
     */
    ExamPaperModel queryQuestionForFix(String courseId, String templateId, String operator);

    /**
     * 一级考试接口
     * @param studentCode 学号
     * @param  score 操作题总分
     * @return 剩余分钟数
     * @author 王雪芬
     * @since 2019年2月16日
     */
    boolean getExamOneLevel(String studentCode, Double score);

    long queryExamTimeOneLevel(String studentCode);

    boolean downLoadStudentOneLevel(String studentCode);
    /*
     * 更新答题记录,可以使用rabbitmq,也可以使用直接进行更新
     * @param paperOnlineRecordModel
     * @return
     */
    boolean updateExamPaperRecordIsRabbit(PaperOnlineRecordModel paperOnlineRecordModel);

    /**
     * 交卷，修改考生考试状态为“已交卷”状态(小练)
     *
     * @param examineeEntity 考生安排
     * @return 成功或者失败
     * @author  闫伟强
     * @since 2.0.0 2019年7月12日17:35:10
     */
    boolean xiaoLianUpdateExamStateBySumit(ExamineeEntity examineeEntity);
}
